const marked = require('marked')
const Post = require('../lib/mongo').Post
const CommentModel = require('./comment.js');

module.exports = {
  // 创建一篇文章
  create: function create(post) {
    return new Promise((resolve, reject) => {
      Post.create(post, function (err, result) {
        if (err) {
          reject(err);
        } else {
          resolve(result);
        }
      });
    })
  },

  // 通过文章 id 获取一篇文章
  getPostById: function getPostById(postId) {
    return Post
      .findOne({ _id: postId })
      .populate({ path: 'author', model: 'User' })
      .exec()
      .then(post => {
        // 手动给文章添加 commentcount 字段
        if (post) {
          return CommentModel.getCommentsCount(post._id).then(function (count) {
            post.commentsCount = count;
            return post;
          })
        }
        return post;
      })
  },

  // 按创建时间降序获取所有用户文章或者某个特定用户的所有文章
  getPosts: function getPosts(author) {
    const query = {}
    if (author) {
      query.author = author
    }
    return Post.find(query)
      .populate({ path: 'author', model: 'User' })
      .sort({ _id: -1 })
      .exec()
      .then(res => {
        // 查询文章详情的时候，手动给文章添加 commentcount 字段
        return Promise.all(res.map(function (post) {
          return CommentModel.getCommentsCount(post._id).then(function (commentsCount) {
            post.commentsCount = commentsCount;
            return post;
          })
        }))
      })
  },

  // 通过文章 id 给 pv 加 1
  incPv: function incPv(postId) {
    return Post
      .updateOne({ _id: postId }, { $inc: { pv: 1 } })
      .exec();
  },

  // 通过文章id获取一篇自己的文章（编辑文章）
  getRawPostById: function getRawPostById(postId) {
    return Post
      .findOne({ _id: postId })
      .populate({ path: 'author', model: 'User' })
      .exec();
  },

  // 通过文章id 更新一篇文章
  updatePostById: function updatePostById(postId, data) {
    return Post
      .updateOne({ _id: postId }, { $set: data })
      .exec();
  },

  // 通过文章 id 删除一篇文章
  delPostById: function delPostById(postId, author) {
    return Post
      .deleteOne({ _id: postId, author: author })
      .exec()
      .then(res => {
        if (res.result.ok && res.result.n > 0) {
          return CommentModel.delCommentsByPostId(postId);
        }
      })
  }
}